/*
 * Copyright (c) 2005 Your Corporation. All Rights Reserved.
 */
package com.tim.framework.page;

import java.util.ArrayList;
import java.util.List;


/**
 * 处理数字的分页
 */
public class NumberPage implements Page {
	private int allNumber;
	private int pageSize;
	private int pageNumber;

	/**
	 * 构建NumberPage对象，完成分页处理
	 * 
	 * @param allNumber
	 *            总数
	 * @param pageNumber
	 *            当前页编码，从1开始，如果传的值为Integer.MAX_VALUE表示获取最后一页。
	 *            如果你不知道最后一页编码，传Integer.MAX_VALUE即可。如果当前页超过总页数，也表示最后一页。
	 *            这两种情况将重新更改当前页的页码，为最后一页编码。
	 * @param pageSize
	 *            每一页显示的条目数
	 */
	public NumberPage(int allNumber, int pageNumber, int pageSize) {
		this.allNumber = allNumber;
		this.pageSize = pageSize;
		this.pageNumber = pageNumber;
		if (Integer.MAX_VALUE == this.pageNumber
				|| pageNumber > getLastPageNumber())
			this.pageNumber = getLastPageNumber();
	}

	public boolean isFirstPage() {
		return getThisPageNumber() == 1;
	}

	public boolean isLastPage() {
		return getThisPageNumber() >= getLastPageNumber();
	}

	public boolean hasNextPage() {
		return getLastPageNumber() > getThisPageNumber();
	}

	public boolean hasPreviousPage() {
		return getThisPageNumber() > 1;
	}

	public int getLastPageNumber() {
		int totalElements = allNumber;
		return totalElements % this.pageSize == 0 ? totalElements
				/ this.pageSize : totalElements / this.pageSize + 1;
	}

	/**
	 * 返回List类型数据
	 * 
	 * @return List数据源
	 */
	public Object getThisPageElements() {
		List<Long> list = new ArrayList<Long>();
		for (int i = 1; i <= getLastPageNumber(); i++) {
			list.add(new Long(i));
		}
		return list;
	}

	public int getTotalNumberOfElements() {
		return allNumber;
	}

	public int getThisPageFirstElementNumber() {
		return (getThisPageNumber() - 1) * getPageSize();
	}

	public int getThisPageLastElementNumber() {
		int fullPage = getThisPageFirstElementNumber() + getPageSize() - 1;
		return getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()
				: fullPage;
	}

	public int getNextPageNumber() {
		if (hasNextPage())
			return getThisPageNumber() + 1;
		else
			return getLastPageNumber();
	}

	public int getPreviousPageNumber() {
		if (hasPreviousPage())
			return getThisPageNumber() - 1;
		else
			return 1;
	}

	public int getPageSize() {
		return pageSize;
	}

	public int getThisPageNumber() {
		return pageNumber;
	}
}
